/**
 * Copyright (c) 2013-2022 Nikita Koksharov
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.redisson.api;

import java.util.concurrent.TimeUnit;

/**
 * Redission RObjectAsync接口是Redisson库中的一个接口,用于异步操作Redis对象
 * 提供了一种异步的方式来操作Redis的数据结构，如Map、List、Set等。通过使用RObjectAsync接口，可以实现对Redis对象的异步读写操作，从而提高系统的性能和并发能力
 */
public interface RObjectAsync {

    /**
     * 返回自上次对该对象执行写入或读取操作以来所花费的秒数。 异步
     */
    RFuture<Long> getIdleTimeAsync();

    /**
     * 返回 Redis 内存中对象使用的字节数。
     */
    RFuture<Long> sizeInMemoryAsync();

    /**
     * 使用方法返回的状态恢复对象dumpAsync()。
     */
    RFuture<Void> restoreAsync(byte[] state);

    /**
     * 使用dumpAsync()方法返回的状态恢复对象并设置其生存时间。
     */
    RFuture<Void> restoreAsync(byte[] state, long timeToLive, TimeUnit timeUnit);

    /**
     * 如果对象已存在，则恢复并替换该对象。
     */
    RFuture<Void> restoreAndReplaceAsync(byte[] state);

    /**
     * 如果对象已存在，则恢复并替换该对象并设置其生存时间。
     */
    RFuture<Void> restoreAndReplaceAsync(byte[] state, long timeToLive, TimeUnit timeUnit);

    /**
     * 返回对象的转储
     */
    RFuture<byte[]> dumpAsync();

    /**
     * 更新异步模式下对象的最后访问时间
     */
    RFuture<Boolean> touchAsync();

    /**
     * 以异步模式将对象从源 Redis 实例传输到目标 Redis 实例
     */
    RFuture<Void> migrateAsync(String host, int port, int database, long timeout);

    /**
     * 以异步模式将对象从源 Redis 实例复制到目标 Redis 实例
     */
    RFuture<Void> copyAsync(String host, int port, int database, long timeout);

    /**
     * 以异步模式将对象移动到另一个数据库
     */
    RFuture<Boolean> moveAsync(int database);

    /**
     * 以异步模式删除对象
     */
    RFuture<Boolean> deleteAsync();

    /**
     * 删除对象。实际删除将在稍后异步发生。
     */
    RFuture<Boolean> unlinkAsync();

    /**
     * 将当前对象键重命名为newName 异步模式
     */
    RFuture<Void> renameAsync(String newName);

    RFuture<Boolean> renamenxAsync(String newName);

    /**
     * 检查异步模式下对象是否存在。
     */
    RFuture<Boolean> isExistsAsync();

    /**
     * 添加对象事件监听器
     */
    RFuture<Integer> addListenerAsync(ObjectListener listener);

    /**
     * 删除对象事件监听器
     */
    RFuture<Void> removeListenerAsync(int listenerId);

}
